package com.cim.model
{
	import com.cim.utils.NaranjaFactory;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.utils.Dictionary;
	
	import mx.collections.ArrayCollection;
	
	[Event(name=UPDATE, type="flash.events.Event")]
	[Event(name=COMPLETE, type="flash.events.Event")]
	[Event(name=UMBRAL_DEFECTUOSAS_AlCANZADO, type="flash.events.Event")]
	public class MainModel extends EventDispatcher
	{
		private const UMBRAL_DEFECTUOSAS:uint = 30;//30%
		
		public static const UPDATE:String = "UPDATE";
		public static const COMPLETE:String = "COMPLETE";
		public static const UMBRAL_DEFECTUOSAS_AlCANZADO:String = "UMBRAL_DEFECTUOSAS_AlCANZADO";
		private var _unprocessed:Array;
		private var _totalesPorClase:Dictionary = new Dictionary();
		private var naranjaActual:Naranja;
		public var chartClases:ArrayCollection;
		public var chartPesos:ArrayCollection;
		public var chartDiametros:ArrayCollection;
		
		[Bindable]
		public var procesadas:Array;
		
		public function MainModel(target:IEventDispatcher=null)
		{
			super(target);
			reset();
			_totalesPorClase[ClasificadorNaranjas.CLASE_A] = 0;
			_totalesPorClase[ClasificadorNaranjas.CLASE_B] = 0;
			_totalesPorClase[ClasificadorNaranjas.DEFECTUOSA] = 0;
		}
		
		public function next():void
		{
			naranjaActual = _unprocessed.pop();
			_totalesPorClase[naranjaActual.getClase().getNombre()]++;
			dispatchEvent(new Event(UPDATE));
			
			if (!_unprocessed.length){
				armarChartClases();
				dispatchEvent(new Event(COMPLETE));
			}
			sensarDefectuosas();
			loggearParametros(naranjaActual);
			procesadas.push(naranjaActual);
		}
		
		private function armarChartClases():void
		{
			chartClases = new ArrayCollection([
				{'clase':'Clase A', 'cantidad':_totalesPorClase[ClasificadorNaranjas.CLASE_A]},
				{'clase':'Clase B', 'cantidad':_totalesPorClase[ClasificadorNaranjas.CLASE_B]},
				{'clase':'Defectuosas', 'cantidad':_totalesPorClase[ClasificadorNaranjas.DEFECTUOSA]}])
		}
		
		private function loggearParametros(naranjaActual:Naranja):void {
			chartPesos.addItem({'naranja': chartPesos.length, 'peso': naranjaActual.getPeso()});
			chartDiametros.addItem({'naranja': chartDiametros.length, 'diametro': naranjaActual.getDiametro()});
		}
		
		private function sensarDefectuosas():void {
			var defectuosas:uint = _totalesPorClase[ClasificadorNaranjas.DEFECTUOSA];
			if(defectuosas > UMBRAL_DEFECTUOSAS * NaranjaFactory.TAMANIO_TANDA /100){
				armarChartClases();
				dispatchEvent(new Event(UMBRAL_DEFECTUOSAS_AlCANZADO));
			}
		}
		
		public function get unprocessed():Array
		{
			return _unprocessed;
		}

		public function set unprocessed(value:Array):void
		{
			_unprocessed = value;
		}
		
		public function reset():void
		{		
			for (var key:Object in _totalesPorClase)
				_totalesPorClase[key]=0;
			_unprocessed = [];
			procesadas = [];
			chartClases = new ArrayCollection();
			chartPesos = new ArrayCollection();
			chartDiametros = new ArrayCollection();
			dispatchEvent(new Event(UPDATE));
			naranjaActual = new Naranja();
		}
		
		public function amountByClass(clase:String):int
		{
			return _totalesPorClase[clase];
		}
		
		public function getPesoActual():Number{
			return naranjaActual.getPeso();
		}
		
		public function getDiametroActual():Number{
			return naranjaActual.getDiametro();
		}
		
		public function getColorActual():Number{
			return naranjaActual.getColor();
		}
		
		public function getClaseActual():String{
			if(naranjaActual.getClase())
				return naranjaActual.getClase().getNombre();
			return "";
		}

	}
}